// 登录拦截中间件
module.exports = async (req, res, next) => {
    const jwt = require('jsonwebtoken')
    const SECREY = require('../key')
    const rootUser = require('../model/rootUser')
    const assert = require('http-assert')
  
    try {
      // 1.判断请求中是否携带 token
      const token = (req.headers.authorization || '').split(' ').pop();
      assert(token, 401, '请携带token')
    
      // 2.判断 token 中是否存在 id
      const tokenDate = jwt.verify(token, SECREY, function (err, decoded) {
        // 第3个参数，当 jwt 验证错误时，执行；
        // err: 错误信息； decoded：成功数据
        assert(decoded, 401, 'jwt格式错误')
        return decoded
      })

      // 断言发现错误后，程序不会往下执行
    
      // 3.根据 id 在数据库中，查找是否存在对应的用户
      try {
        req.use = await rootUser.findOne({_id: tokenDate.id})
        assert(req.use, 401, '用户不存在')
      } catch (err) {
        next(err)
      }

      next()

    } catch(error) {
      // 将抛出的异常传递到错误处理中间件
      next(error)
    }
}